import redis
from redis.exceptions import RedisError



class RedisStringUtil:
    """Redis字符串类型操作工具类"""

    def __init__(self, host='localhost', port=6379, db=0, password=None):
        """
        初始化Redis连接
        
        :param host: Redis服务器主机地址
        :param port: Redis服务器端口
        :param db: 数据库编号
        :param password: 连接密码
        """
        self.redis_client = redis.Redis(
            host=host,
            port=port,
            db=db,
            password=password,
            decode_responses=True  # 自动将字节转换为字符串
        )
    
    def set_key(self, key, value, expire_seconds=None):
        """
        新建或设置字符串类型的键值对
        
        :param key: 键名
        :param value: 字符串值
        :param expire_seconds: 过期时间(秒)，None表示永不过期
        :return: 成功返回True，失败返回False
        """
        try:
            if expire_seconds:
                return self.redis_client.setex(key, expire_seconds, value)
            else:
                return self.redis_client.set(key, value)
        except RedisError as e:
            print(f"设置键值对失败: {e}")
            return False
    
    def update_key(self, key, new_value, expire_seconds=None):
        """
        更新字符串类型的键值对
        
        :param key: 键名
        :param new_value: 新的字符串值
        :param expire_seconds: 新的过期时间(秒)，None表示保持原有过期时间
        :return: 成功返回True，失败返回False
        """
        # 先判断键是否存在
        if not self.has_key(key):
            print(f"键 {key} 不存在，无法更新")
            return False
            
        return self.set_key(key, new_value, expire_seconds)
    
    def delete_key(self, key):
        """
        删除指定的键
        
        :param key: 要删除的键名
        :return: 成功返回True，失败或键不存在返回False
        """
        try:
            # delete方法返回删除的键的数量
            result = self.redis_client.delete(key)
            return result > 0
        except RedisError as e:
            print(f"删除键失败: {e}")
            return False
    
    def has_key(self, key):
        """
        判断键是否存在
        
        :param key: 要判断的键名
        :return: 存在返回True，不存在返回False
        """
        try:
            return self.redis_client.exists(key)
        except RedisError as e:
            print(f"判断键是否存在失败: {e}")
            return False

# 使用示例
if __name__ == "__main__":
    # 初始化工具类
    redis_util = RedisStringUtil(host='192.168.0.214', port=6379, db=0)
    
    # 新建键
    set_result = redis_util.set_key("username", "zhangsan", 3600)
    print(f"新建键结果: {set_result}")
    
    # 判断键是否存在
    exists = redis_util.has_key("username")
    print(f"键是否存在: {exists}")
    
    # 更新键
    update_result = redis_util.update_key("username", "lisi")
    print(f"更新键结果: {update_result}")
    
    # 删除键
    delete_result = redis_util.delete_key("username")
    print(f"删除键结果: {delete_result}")
    
    # 再次判断键是否存在
    exists_after_delete = redis_util.has_key("username")
    print(f"删除后键是否存在: {exists_after_delete}")
